#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 100;
int n, len, tn;
int stick[N];
bool flag[N];
// 首先，因为字符串拼接的顺序没有关系，所以这是一个组合问题

bool dfs(int all, int sz, int nl, int next)
{
    if (sz > all)
        return true;
    if (nl == len)
        return dfs(all, sz + 1, 0, 1);
    // 直接先最长的木棍处开始递归，减少分支
    int tail = 0;
    for (int i = next; i < tn; ++i)
    {
        if (!flag[i] && nl + stick[i] <= len && stick[i] != tail)
        {
            flag[i] = true;
            if (dfs(all, sz, nl + stick[i], i + 1))
                return true;
            flag[i] = false;
            tail = stick[i];
            // 剪枝
            // 如果到达这个地方的时候长度为0或者长度已经达到len，但是失败了，那就一定不可能拼接完成
            if (nl == 0 || nl + stick[i] == len)
                return false;
        }
    }
    return false;
}

int main()
{
    while (cin >> n && n)
    {
        int r = 0;
        int sum = 0;
        tn = 0;
        for (int i = 0; i < n; ++i)
        {
            int tmp;
            cin >> tmp;
            if (tmp <= 50)
                stick[tn++] = tmp;
            r = max(r, stick[tn - 1]);
            sum += stick[tn - 1];
        }
        sort(stick, stick + tn, greater<int>());
        for (len = r; len <= sum; ++len)
        {
            // 如果长度都不是倍数关系，一定不能满足，直接跳过
            if (sum % len)
                continue;
            int cnt = sum / len;
            memset(flag, 0, sizeof flag);
            if (dfs(cnt, 1, 0, 0))
                break;
        }
        cout << len << endl;
    }
    return 0;
}